#ifndef _THREADPOOL_H_
#define _THREADPOOL_H_

#include <list>
#include <queue>
#include <memory>
#include <pthread.h>
#include "thread.h"

using namespace std;

// 用户自定义任务的基类
class Task
{
public:
    // 用户自定义任务类继承Task，必须要重写run方法
    virtual void run() = 0;
};

// 线程池类
class ThreadPool
{
public:
    ThreadPool();
    ~ThreadPool();

public:
    // 启动线程池，用户可以通过参数指定线程个数，默认为1个线程
    void startPool(int threadNum = 1);
    // 提交任务到线程池分配线程执行
    void submit(shared_ptr<Task> sp);
private:
    list<shared_ptr<Thread>> threadLists_;
    queue<shared_ptr<Task>> taskQue_;
    pthread_mutex_t queMutex_;
    pthread_cond_t queCond_;
    int poolSize_;

    friend void* doTask(void *task_arg);
};

#endif